home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / MULPRI00 / 4PRN_COO.TXT < prev    next >
Encoding:
Text File  |  1993-08-08  |  6.3 KB  |  153 lines

  1. 4PRN Cookie
  2. ***********
  3.  
  4. Dieser Cookie wird vom Treiberprogramm zur 4-Druckerport-Karte Mulpri 
  5. eingerichtet. Diese Karte stellt 4 Druckerports zur Verfügung, die 
  6. kompatibel zum Originalport sind (inklusive Eingabefunktion) und 
  7. softwaremäßig umgeschaltet werden.
  8.  
  9. Cookie-Name: 4PRN
  10. Cookie-Wert: Zeiger auf Struktur, beginnend auf gerader Adresse
  11.  
  12.  
  13. Die Vierprn-Struktur
  14. --------------------
  15.  
  16. Alle Strukturelemente sind 32Bit lang.
  17.  
  18. Die Anzahl der Strukturelemente und damit der Funktionsumfang wird in 
  19. Zukunft erweitert. Deshalb ist am Anfang die Anzahl eingetragen, die immer 
  20. mindestens 3 beträgt. Möchte man die Funktion eines bestimmten 
  21. Strukturelements nutzen, muß man zuerst anhand der Anzahl prüfen, ob es 
  22. existiert.
  23.  
  24. Alle Funktionen müssen im Supervisormode aufgerufen werden. Parameter 
  25. werden C-mäßig auf dem Stack übergeben. Die Routinen können auch 4 Byte 
  26. hinter ihrem Beginn mit de(m/n) Parameter(/n) in Register D0 aufgerufen 
  27. werden. Ein einzelner Parameter ist entsprechend als WORD oder LONG zu 
  28. übergeben. Bei zwei WORD-Parametern ist der erste im Highword und der 
  29. zweite im Lowword zu übergeben. Der Rückgabewert wird in Register D0 
  30. geliefert. Nicht erklärte Bit im Eingabeparameter sind auf 0 zu setzen, 
  31. nicht erklärte Bit des Ausgabeparameters können beliebige Werte haben. 
  32. Register D0, D1, A0, A1 werden durch die Routinen zerstört. Wenn nicht 
  33. extra angegeben, beeinflußt eine Routine die Einstellung des aktiven Ports 
  34. nicht, obwohl sie durchaus kurz in- und zurückschalten könnte.
  35.  
  36. Damit es beim Multitasking kein Chaos gibt, sind zwei LOCKED-Zustände 
  37. definiert. Beim "Normalzustand" LOCKED1P wurde ein bestimmter Port 
  38. aktiviert. Andere Programme dürfen den aktiven Port bis zur Aufhebung 
  39. dieses Zustandes nicht umschalten. Die Funktionen zur Ausgabe auf einen 
  40. ganz bestimmten Port sind davon aber nicht betroffen. Bei LOCKED4P wurde 
  41. die gesamte Mulpri-Karte von einem Programm reserviert. Eine Umschaltung 
  42. zwischen den Ports ist bis zur Aufhebung dieses Zustandes nur dem einen 
  43. Programm gestattet, das die Adresse der Spezialroutine kennt. Wenn sich 
  44. kein Programm speziell für die Karte interessiert, ist zwar auch ein Port 
  45. durchgeschaltet, der Zustand des Treibers aber nicht LOCKED, also frei.
  46.  
  47. Px wird als Platzhalter überall in der Erklärung benutzt, wo eine 1, 2, 4 
  48. oder 8 für den Druckerport 1 bis 4 stehen kann. Diese ungewöhnliche 
  49. Numerierung wurde aus Geschwindigkeitsgründen benutzt.
  50.  
  51.  
  52. Vierprn-Struktur in C-Notation
  53. ------------------------------
  54. struct
  55. { LONG Maxfun;        /* Anzahl der Strukturelemente */
  56.   LONG Activport;     /* Nummer des aktiven Ports */
  57.   LONG (*Pswitch)();  /* Zeiger auf Funktion zur Umschaltung */
  58.   LONG (*Pbusy)();    /* Zeiger auf Funktion zur BUSY-Testung */
  59.   LONG (*Pstrobe)();  /* Zeiger auf Funktion zur STROBE-Steuerung */
  60.   LONG (*Psetdata)(); /* Zeiger auf Funktion zum Daten ausgeben */
  61.   LONG (*Pput)();     /* Zeiger auf Funktion zum Drucken eines Zeichens */
  62. } Vierprn;
  63.  
  64.   
  65. LONG Maxfun
  66. Anzahl der insgesamt vorhandenen 32Bit-Werte
  67.  
  68. LONG Activport
  69. Mögliche Werte: 1, 2, 4, 8. Hier steht die Nummer des aktiven Ports, auch 
  70. wenn kein LOCKED existiert. Diese Stelle darf nur gelesen werden! Sie ist 
  71. für Interruptroutinen gedacht. Spezialhinweis: Nur bei IPL7 können Wert und 
  72. eingestellter Port differieren. Man sollte deshalb nie in einem 
  73. IPL7-Interrupt (der nichtmaskierbare, kann z.B. vom VME-Bus ausgelöst 
  74. werden) auf 4-Port-Zeug zugreifen. Umgehungsvariante (auch für 
  75. Soundchipzugriffe, die normalerweise mit IPL6 oder IPL7 geklammert werden, 
  76. damit keiner zwischendurch die Registerauswahl ändert) ist ein Test des auf 
  77. dem Stack abgelegten Statusregisters. Zeigt diese Statusregister-Kopie ein 
  78. IPL kleiner 6, so darf man zugreifen.
  79.  
  80. LONG Pswitch(WORD switch)
  81. switch:
  82. -1
  83.    erfrage Nummer des aktiven Ports
  84.    liefert -1, falls LOCKED4P aktiv ist
  85.            0,  falls kein LOCKED aktiv ist, also die Ports frei sind
  86.            Px  des aktiven Ports, falls LOCKED1P aktiv ist
  87. 0
  88.    hebt LOCKED1P-Zustand auf. Ehrlicherweise sollte nur der 
  89.    LOCKED1P-Verursacher es aufheben. Wirkungslos bei LOCKED4P.
  90. Px
  91.    aktiviere Port Px und LOCKED1P ihn. Liefert Px des vorher aktiven Ports 
  92.    oder 0, wenn Umschaltung wegen LOCKED unmöglich war.
  93.  
  94. LONG Pbusy(WORD pp)
  95. liefert Busy von Port pp
  96. pp:       Px
  97. Rückgabe: BUSY-Bit des Ports pp in bit0
  98.  
  99. LONG Pstrobe(WORD pp, WORD strobe)
  100. setzt STROBE-Signal von Port pp
  101. pp:       Px
  102. strobe:   bit5 repräsentiert Pegel für STROBE-Leitung
  103. Rückgabe: nichts
  104.  
  105. LONG Psetdata(WORD pp, WORD data)
  106. setzt die Daten (bit7..0) von Port pp auf den Wert data
  107. pp:       Px
  108. data:     bit7..0 enthalten Datenbit
  109. Rückgabe: nichts
  110. Der Port wird automatisch auf Ausgabe geschaltet, da sonst der Aufruf 
  111. dieser Funktion sinnlos wäre. Falls man einzelne Bits setzen/löschen 
  112. will, sollte man sich den alten Ausgabewert selbst merken.
  113.  
  114. LONG Pput(WORD pp, WORD zeichen)
  115. druckt ein Zeichen aus, wenn Drucker nicht busy ist
  116. pp:       Px
  117. zeichen:  bit7..0 enthalten auszugebendes Zeichen
  118. Rückgabe: -1 wenn Zeichen gedruckt wurde
  119.            0 wenn Zeichen nicht gedruckt wurde
  120. Der Port wird automatisch auf Ausgabe geschaltet, da sonst der Aufruf 
  121. dieser Funktion sinnlos wäre. Das Zeichen wird auf D7..0 gelegt und /STROBE 
  122. auf inaktiv (high). BUSY wird getestet. Ist es aktiv (high), so wird sofort 
  123. mit Fehlermeldung 0 beendet. Ist es inaktiv (low), so wird ein 
  124. /STROBE-Impuls (low) gegeben, und Rückmeldung ist -1. Die Routine wartet 
  125. also nicht.
  126.  
  127.  
  128. Druckerspooler
  129. --------------
  130. Hier ahne ich schon viele Probleme...
  131. So können MFP-BUSY-Bit-Interrupt getriebene Druckerspooler korrekt mit 
  132. 4-Port zusammenarbeiten: Tritt der BUSY-Interrupt auf, muß zuerst getestet 
  133. werden, ob der eigene Port aktiv ist (Activport). Wenn ja, muß noch 
  134. getestet werden, ob wirklich die gewünschte (nicht-)BUSY-Bedingung 
  135. vorliegt, dann darf die Ausgabe erfolgen. Andernfalls muß der Interrupt 
  136. beendet werden.
  137.  
  138. Natürlich kann sich ein Spooler auch in einen Timer-Interrupt einhängen und 
  139. dann einfach auf Verdacht die Routine Pput aufrufen. Anhand des 
  140. Rückgabewertes stellt er fest, ob er sein Byte losgeworden ist oder nicht.
  141.  
  142.  
  143. Harun Scheutzow, (C) SWB 27.07.1993 und später
  144. letzte Änderung: 07.08.1993
  145.  
  146. Harun Scheutzow
  147. Dresdener Straße 83
  148. 10179 Berlin
  149.  
  150. Email:
  151. im Mausnetz:      Harun Scheutzow @B
  152. aus dem Internet: Harun_Scheutzow@B.maus.de
  153.